// JavaScript Document
/*DEFINICION DE FUNCIONES Y VARIABLES GLOBALES*/

	var mispuntosLayer = new OpenLayers.Layer.Markers("Mis Puntos"); //capa del mapa en donde se imprimen los iconos de mis puntos.

	var misPuntosHash = new Hashtable(); ////hash de todos los puntos, accesible por id del punto
	var misGruposHash = new Hashtable(); ////hash de todos los grupos, accesible por id del grupo
	var misPuntosMarkersHash = new Hashtable(); //hash con los Markers de los puntos (se van creando a medida que se hacen visibles)

	var puntosSeleccionadosId = new Array();		
	var puntosSeleccionadosHeredadosId = new Array(); 

	if (msie){
		var misPuntosPopupClass = OpenLayers.Class(OpenLayers.Popup.Anchored, {
            	'autoSize': true,
				'minSize': new OpenLayers.Size(250,150),
				'maxSize': new OpenLayers.Size(600,400)
        	});
	}
	else{
		var misPuntosPopupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {
            	'autoSize': true, 
				'maxSize': new OpenLayers.Size(600,400)
       		});
	}
	
	var misPuntosPopupActive = null;
	
	var misPuntosVisiblesId = new Array();
	if (trim(PUNTOSVISIBLES_string)!='') {
		misPuntosVisiblesId = PUNTOSVISIBLES_string.split(",");
	}
	
	function createHighlightFromIdPoint(idPoint){
		var lonlat = new OpenLayers.LonLat(parseFloat(misPuntosHash.get(idPoint.toString()).longitud), parseFloat(misPuntosHash.get(idPoint.toString()).latitud)).transform(displayProjection, projection);
		putHighlightCircle(lonlat);
	}

   function addOptionsToGrupoSelector(){
		var misGruposList = misGruposHash.values();
		if (misGruposList.length>0){
		   selector = document.getElementById('gruposPunto');
		   selector.options.length=0; //remove all options
		   newOption = document.createElement('option');
		   newOption.value = '0';
		   newOption.text = '';
		   try {
    			selector.add(newOption, null); // para todos los browsers (STANDART)
			   }
		  catch(ex) {
			    selector.add(newOption); // para IE
			   }				 
		   for (var i=0; i<misGruposList.length; i++){
			 if (misGruposList[i]!='toJSONString'){
				 newOption = document.createElement('option');
				 newOption.value = misGruposList[i].id;
				 newOption.text = misGruposList[i].nombre;
				   try {
    					selector.add(newOption, null); // para todos los browsers (STANDART)
					   }
				  catch(ex) {
					    selector.add(newOption); // para IE
					   }				 
			 }
		   }
		}		
	}
   
   function createPopUpPoint(e, idPoint, element){
	   PopUpMenuMap = new PopupMenu();
	   var heredado = eval(misPuntosHash.get(idPoint.toString()).esflota==3);
	   if (indexOfArray(misPuntosVisiblesId,idPoint.toString())!=-1){
		    PopUpMenuMap.add('Ocultar', function(target) {
		   		ocultarPunto(idPoint.toString());
	   		});
	 	    PopUpMenuMap.add('Localizar en el mapa', function(target) {
	 	    		dejarDeSeguir();
					createHighlightFromIdPoint(idPoint);
					centrar(misPuntosHash.get(idPoint.toString()).latitud,misPuntosHash.get(idPoint.toString()).longitud);	      
	  	    });
	   }
	   else {
	   		PopUpMenuMap.add('Ver y localizar', function(target) {
				mostrarPunto(idPoint.toString());
				dejarDeSeguir();
				createHighlightFromIdPoint(idPoint);
				centrar(misPuntosHash.get(idPoint.toString()).latitud,misPuntosHash.get(idPoint.toString()).longitud);
				
	  	        });
	   		PopUpMenuMap.add('Ver', function(target) {
				mostrarPunto(idPoint.toString());     
	  	        });
	   }
	   if ((LOGIN.PERMISOS[7])&&((!heredado)||(parseInt(LOGIN.objetivoDB) == 3))){
		   PopUpMenuMap.addSeparator();
		   PopUpMenuMap.add('Modificar', function(target) {
    		  modificarPunto(idPoint.toString());
		   });
		   PopUpMenuMap.add('Eliminar', function(target) {
	    	  eliminarPuntos(idPoint.toString());
		   });
	   }
	   
	   if (LOGIN.PERMISOS[7]){
		   PopUpMenuMap.addSeparator();
		   //if (parseInt(LOGIN.objetivoDB) == 3){ //SE PUEDE PUBLICAR		   
	  	   if (parseInt(LOGIN.objetivo) == 3){ //SE PUEDE PUBLICAR SOLO SI ES FLOTA	   
		   	   if (parseInt(misPuntosHash.get(idPoint.toString()).publico))
		   			PopUpMenuMap.add('Dejar de publicar', function(target) {
	      				publicarPuntos(false, idPoint.toString());
		   			});
		   	   else
	   				PopUpMenuMap.add('Publicar', function(target) {
	      				publicarPuntos(true, idPoint.toString());
	  				});
	   		}
	   		if (parseInt((misPuntosHash.get(idPoint.toString()).seguro)))
	   			PopUpMenuMap.add('Desmarcarlo como seguro', function(target) {
					seguroPuntos(false, idPoint.toString());
		   		});
		    else
	   			PopUpMenuMap.add('Marcar como seguro', function(target) {
					seguroPuntos(true, idPoint.toString());
	   			});
	   }
	   
	   PopUpMenuMap.addSeparator();
	   PopUpMenuMap.add('Buscar moviles mas cercanos', function(target) {											  
	      			generateMovilesCercanosPunto(idPoint.toString(), false);
	  			});	   
	   
	   PopUpMenuMap.setSize(140, 0);
	   PopUpMenuMap.bind(element); // target is this pre block
	   PopUpMenuMap.show(e);
	   return false;
	   }
	
	   function createPopUpGroup(e, idGrupo, element){

	   PopUpMenuMap = new PopupMenu();
		
	   if (LOGIN.PERMISOS[7]){	
		   PopUpMenuMap.add('Modificar', function(target) {
    		  modificarGrupo(idGrupo.toString());
		   });
		   PopUpMenuMap.add('Eliminar', function(target) {
	    	  eliminarGrupos(idGrupo.toString());
		   });
		   PopUpMenuMap.addSeparator();
	   }
	   
	   PopUpMenuMap.add('Seleccionar todo', function(target) {
          checkedGrupo(idGrupo.toString(), true);
	   });
	   PopUpMenuMap.add('No seleccionar ninguno', function(target) {
	      checkedGrupo(idGrupo.toString(), false);
	   });

	   PopUpMenuMap.setSize(140, 0);
	   PopUpMenuMap.bind(element); // target is this pre block
	   PopUpMenuMap.show(e);
	   return false;
	   }
	
	function getInfoMisPuntosHTML(puntoId){
    	miPunto = misPuntosHash.get(puntoId.toString());
		html = '<table width="200"><tr>';
		html += ' <td><span class="infoWindowTitle">'+miPunto.nombre+'</span></td>';
        	html += ' <td align="right" valign="top">';
		if ((parseInt(LOGIN.objetivoDB)==3)&&(miPunto.publico==1))
			html += '<img src="images/puntoPublico.gif" width="16" height="16" border="0" title="Punto publicado"/>';
		if (miPunto.seguro==1)	
			html += '<img src="images/puntoSeguro.gif" width="16" height="16" border="0" title="Punto seguro"/>';
		html += '</td></tr>';
		html += '<tr><td colspan="2"><span class="inputTEXT">'+miPunto.datos+'</span></td></tr>';
		html += '</table>';
		
		return html;
	}
	
	function crearMarcaDePunto(point,name,id,icon) {		
		var feature = new OpenLayers.Feature(mispuntosLayer, point); 
            feature.closeBox = true;
			if ((id!=null)&&(id!='')){
            	feature.popupClass = misPuntosPopupClass;
            	feature.data.popupContentHTML = getInfoMisPuntosHTML(id);
			}
            feature.data.overflow = "auto";
			feature.data.icon = icon.clone();
		
		var marker = feature.createMarker();

        var markerClick = function (evt) {
                if (this.popup == null) {
                    this.popup = this.createPopup(this.closeBox);						
                    map.addPopup(this.popup);
                    this.popup.show();
                } else {
                    this.popup.toggle();
                }
				if ((misPuntosPopupActive != null)&&(misPuntosPopupActive != this.popup)&&(misPuntosPopupActive.visible()))
					misPuntosPopupActive.hide();
                misPuntosPopupActive = this.popup;
                OpenLayers.Event.stop(evt);
            };
		if ((id!=null)&&(id!='')){
        	marker.events.register("mousedown", feature, markerClick);
		}
        return marker;
      }
/*************************FUNCIONES PARA PANTALLA PRINCIPAL************************/
	
	var reqHandlerMisPuntos = null;
	
	function ocultarPuntosVisibles(){
		for (i=0; i<misPuntosVisiblesId.length; i++){
			var marker = misPuntosMarkersHash.get(misPuntosVisiblesId[i].toString());
			if ((marker!=null)&&(marker!='undefined')){
				marker.display(false);
			}
		}
	}
	
	function mostrarPuntosVisibles(){
		for (i=0; i<misPuntosVisiblesId.length; i++){
			var marker = misPuntosMarkersHash.get(misPuntosVisiblesId[i].toString());
			if ((marker!=null)&&(marker!='undefined')){
				marker.display(true);
			}
		}
	}
	
	function mostrarPunto(idPunto){
		misPuntosVisiblesId.push(idPunto.toString());
		refreshViewPoints();		
	}
	
	function ocultarPunto(idPunto){
		pos=indexOfArray(misPuntosVisiblesId,idPunto.toString());
		if (pos!=-1)
			misPuntosVisiblesId.splice(pos,1);
		refreshViewPoints();		
	}
		
	function verPuntosSeleccionados(){
		misPuntosVisiblesId = new Array();
		for (i=0; i<puntosSeleccionadosId.length;i++)
			misPuntosVisiblesId[i] = puntosSeleccionadosId[i];
		for (i=0; i<puntosSeleccionadosHeredadosId.length;i++)
			misPuntosVisiblesId.push(puntosSeleccionadosHeredadosId[i]);
		refreshViewPoints();
	}
	
	function ocultarPuntosSeleccionados(){
		for (i=0;i<puntosSeleccionadosId.length;i++){
			pos=indexOfArray(misPuntosVisiblesId,puntosSeleccionadosId[i].toString());
			if (pos!=-1)
				misPuntosVisiblesId.splice(pos,1);
		}
		for (i=0;i<puntosSeleccionadosHeredadosId.length;i++){
			pos=indexOfArray(misPuntosVisiblesId,puntosSeleccionadosHeredadosId[i].toString());
			if (pos!=-1)
				misPuntosVisiblesId.splice(pos,1);
		}
		refreshViewPoints();
	}
	
	function printTableMisPuntos(){	
		//tabla = '<table width="260">';
		//tabla += '<tr><td>';
		
		puntosTree = new dTree('puntosTree');
		puntosTree.add(0,-1,'');
		
		var misGruposList = misGruposHash.values();
		var sortArray = new SortArray(misGruposList,"QUICKSORT");
		sortArray.ordenar('A','nombre');

		var misGruposListKeys = new Array();
		for (var i=0; i<misGruposList.length; i++)
			misGruposListKeys.push(misGruposList[i].id);

		for (var i=0; i<misGruposList.length; i++) {
			//var groupId = parseInt(misGruposList.id);
			var groupName = '<span class="inputLBL" oncontextmenu="return createPopUpGroup(event,'+misGruposList[i].id+',this);">'+misGruposList[i].nombre+'</span>';
			puntosTree.add(i+1,0,groupName,'','','','js/dtree/img/folder.gif');
		}
		
		var misPuntosList = misPuntosHash.values();
		sortArray = new SortArray(misPuntosList,"QUICKSORT");
		sortArray.ordenar('A','nombre');
		
		for (var i=0; i<misPuntosList.length; i++) {
			if (misPuntosList[i]!='toJSONString'){
				checked = '';
				var heredado = false; //es un punto de flota y soy un movil
				if (indexOfArray(puntosSeleccionadosId,misPuntosList[i].id.toString())!=-1)
					checked='checked';
				if (indexOfArray(puntosSeleccionadosHeredadosId,misPuntosList[i].id.toString())!=-1)
					checked='checked';
				if ((parseInt(LOGIN.objetivoDB)==2)&&(misPuntosList[i].esflota==3))
					heredado=true;
				itemSpan = "";
				if (!heredado){
					itemSpan += '<div style="width:200px; display:inline; vertical-align:middle; top:-10px;" oncontextmenu="return createPopUpPoint(event,'+misPuntosList[i].id+',this);">';
        			checkVal = " <input type='checkbox' name='boxPoints[]' value='"+misPuntosList[i].id+"' "+checked+" onClick='checkedPunto(this);'>";
				}
				else{
					itemSpan += '<div style="width:200px; display:inline; vertical-align:middle; top:-10px; background:#F1F1F1;" oncontextmenu="return createPopUpPoint(event,'+misPuntosList[i].id+',this);">';
					checkVal = " <input type='checkbox' name='boxPoints[]' value='"+misPuntosList[i].id+"' "+checked+" onClick='checkedPuntoHeredado(this);'>";
				}
				itemSpan += '<img src="'+mapIcons.getMisPuntosIcon(misPuntosList[i].icono).url+'" width="16" height="16" border="0"/>';
				
				itemSpan += '<span class="inputLBL"> ' + misPuntosList[i].nombre + ' </span>';
				//seccion de iconos de estado...
				//SEGURO:
				if (misPuntosList[i].seguro==1){
					itemSpan += '<img src="images/puntoSeguro.gif" width="16" height="16" border="0" title="Punto seguro"/>';
				}
				else
					itemSpan += '<img src="js/dtree/img/empty.gif" width="16" height="16" border="0"/>';
				//PUBLICADO:
				if (parseInt(LOGIN.objetivoDB)==3) {
					if (misPuntosList[i].publico==1){
						itemSpan += '<img src="images/puntoPublico.gif" width="16" height="16" border="0" title="Punto publicado"/>';
						}
					else
						itemSpan += '<img  src="js/dtree/img/empty.gif" width="16" height="16" border="0"/>';
				}
				//VISIBILIDAD:
				if (indexOfArray(misPuntosVisiblesId,misPuntosList[i].id.toString())!=-1){
					itemSpan += '<img  src="images/puntoVisible.gif" border="0" onclick="centrar('+misPuntosList[i].latitud+','+ misPuntosList[i].longitud +'); createHighlightFromIdPoint('+misPuntosList[i].id+');" style="cursor:pointer;" title="Punto visible (Click para localizar)"/>';
				}
				else
					itemSpan += '<img  src="js/dtree/img/empty.gif" width="16" height="16" border="0"/>';
				itemSpan+='</div>';
				
				var posGroup = 0;
				if (parseInt(misPuntosList[i].grupoId)!=0){
					var pos = indexOfArray(misGruposListKeys,misPuntosList[i].grupoId.toString());
					if (pos!=-1)
						posGroup = pos+1;
				}				
				var nodeId = i+misGruposList.length+1;
				puntosTree.add(nodeId, posGroup, itemSpan, '', '', '', '', '', false, checkVal);
			}
		}
		
		document.getElementById('divListaPuntos').innerHTML = puntosTree;
	}

	
	function refreshViewPoints(){
		var misPuntosList = misPuntosHash.values();
		for (var i=0; i<misPuntosList.length; i++) {
			if (misPuntosList[i]!='toJSONString'){
				var auxId = misPuntosList[i].id;
				var marker = misPuntosMarkersHash.get(auxId.toString());
				if (indexOfArray(misPuntosVisiblesId,auxId)!=-1){ // Tiene que estar VISIBLE
					if ((marker == null)||(marker=='undefined')){//creo la marca del punto		
			    		miPunto = misPuntosList[i];
						var icon = mapIcons.getMisPuntosIcon(miPunto.icono);
						var point = new OpenLayers.LonLat(parseFloat(miPunto.longitud),  parseFloat(miPunto.latitud)).transform(displayProjection, projection);						
						var marker = crearMarcaDePunto(point,miPunto.nombre,miPunto.id,icon);
						misPuntosMarkersHash.put(auxId.toString(),marker);
						mispuntosLayer.addMarker(marker);
						}
					  marker.display(true);
					}
				else { //tiene que estar OCULTO
					if (marker != null){
					 	marker.display(false);
						}
					}
				}
			}
		if ((misPuntosList.length>0)||(misGruposHash.values().length>0))
		 	printTableMisPuntos();		 
		else
			document.getElementById('divListaPuntos').innerHTML = '<span class="inputLBL">No se encontraron puntos registrados.</span>';
			
	}
		
	function checkedPunto(check, miPunto){
		if (check.checked)
			puntosSeleccionadosId.push(check.value);
		else {
			pos=indexOfArray(puntosSeleccionadosId,check.value);
			if (pos!=-1)
			    puntosSeleccionadosId.splice(pos,1);
			}
	}
	
	function checkedPuntoHeredado(check, miPunto){
		if (check.checked)
			puntosSeleccionadosHeredadosId.push(check.value);
		else {
			pos=indexOfArray(puntosSeleccionadosHeredadosId,check.value);
			if (pos!=-1)
			    puntosSeleccionadosHeredadosId.splice(pos,1);
			}
	}
	
	function OnReadyStateChangeMisPuntos(){
		ready = reqHandlerMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			misPuntosJSON = reqHandlerMisPuntos.responseText.parseJSON();
			if (misPuntosJSON.length != 'undefined') {
				for (i=0; i<misPuntosJSON.length; i++){
					misPuntosHash.put(misPuntosJSON[i].id.toString(),misPuntosJSON[i]);
					if(parseInt(misPuntosJSON[i].grupoId)!=0)//el punto pertenece a un grupo
						if (misGruposHash.containsKey(misPuntosJSON[i].grupoId.toString())){
							misGruposHash.get(misPuntosJSON[i].grupoId.toString()).PUNTOSID.push(misPuntosJSON[i].id.toString());
						}	
				}
				refreshViewPoints();
			}
		
		document.getElementById("busyImg").style.visibility = "hidden";
		autoRefreshFlag = 0;
		}
	}
	
	function CargarMisPuntos() {
		map.addLayer(mispuntosLayer);
    	reqParamsMisPuntos = "COMMAND=MISPUNTOS";
    	reqParamsMisPuntos += "&CUENTA=" + LOGIN.cuentaFk;
		reqParamsMisPuntos += "&ESFLOTA=" + LOGIN.objetivoDB;
		reqParamsMisPuntos += "&OBJETIVO="+ LOGIN.objetivo;
		reqParamsMisPuntos += "&TABLAID="+ LOGIN.tablaId;
		/*if (parseInt(LOGIN.objetivoDB) == 3)
			reqParamsMisPuntos += "&ESFLOTA=1";
		else
			reqParamsMisPuntos += "&ESFLOTA=0";*/
    	document.getElementById("busyImg").style.visibility = "visible";
    	if (msie) 
            reqHandlerMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
        else
            reqHandlerMisPuntos = new XMLHttpRequest();
        reqHandlerMisPuntos.onreadystatechange = OnReadyStateChangeMisPuntos;    
        reqHandlerMisPuntos.open("POST", "querycontroller.php", true);
        reqHandlerMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	reqHandlerMisPuntos.send(reqParamsMisPuntos);
    }
	

/*************************FUNCIONES PARA PANTALLA NUEVO PUNTO************************/
	newPointMarker = null;
	newPointEvents = null;
	newPointLayer = null; 
	
	//icono por defecto al marcar un nuevo punto
	//iconPoint = new OpenLayers.Icon("images/gmapIcons/newPoint.png", iconPointSize, null, iconPointCalculateOffset);
	iconPoint =  mapIcons.getMisPuntosIcon('0');
	
	function initMisPuntosSelectorTipo(){
		var selector = document.getElementById('tipoPunto');
		if (selector.options.length==1){
			var opciones = mapIcons.getMisPuntosLabels();
			for (var i=1; i<opciones.length-1; i++){
				var newOption = document.createElement('option');
				newOption.value = i;
				newOption.text = opciones[i];
				try {
    				selector.add(newOption, null); // para todos los browsers (STANDART)
				}
				catch(ex) {
					selector.add(newOption); // para IE
				}	
			}
		}
	}
	
	function nuevoPunto() {
		//mostrar panel de nuevo punto
		dejarDeSeguir();
		document.getElementById('newPointTitle').innerHTML = "Nuevo Punto";
		document.getElementById('newPointDesc').innerHTML = "Para crear un nuevo punto de referencia puede buscarlo en el mapa y marcarlo con un 'click' o bien utilizar la busqueda de direcciones por calle y altura provistas en el menu superior."
		initMisPuntosSelectorTipo();		
		hideDiv('div_mispuntosPpal');
		hideDiv('div_searchPunto');
		showDiv('div_nuevoPunto');
		setEstadoNuevoPunto();
		cleanFormNuevoPunto();
	}
	
	function marcarNuevoPunto(lonlat){
		if (newPointMarker!=null){
			newPointLayer.removeMarker(newPointMarker);
			newPointMarker.destroy();
		}	
		newPointMarker = crearMarcaDePunto(lonlat,'NUEVO PUNTO',null,iconPoint);
		newPointLayer.addMarker(newPointMarker);
		var lonlat2 = lonlat.clone().transform(projection, displayProjection);
		document.getElementById('newLatitud').innerHTML = lonlat2.lat.toString().substr(0,11);
		document.getElementById('newLongitud').innerHTML = lonlat2.lon.toString().substr(0,11);
		centrar(lonlat2.lat,lonlat2.lon);
	}
	
	function cleanEstadoNuevoPunto(){ //limpia el mapa del estado "MARCAR NUEVO PUNTO"
		if(newPointEvents!=null){
		    newPointEvents.deactivate();
			map.removeControl(newPointEvents);
		}
		map.addControl(defaultEvents);
		defaultEvents.activate();
		hideDiv('div_nuevoPunto');
		showDiv('div_mispuntosPpal');
		if (newPointLayer!=null){
			map.removeLayer(newPointLayer);
			newPointLayer=null;
			newPointMarker=null;
		}
		map.div.style.cursor="default";
	}
	
	function setEstadoNuevoPunto(){ //prepara el mapa para el estado "MARCAR NUEVO PUNTO"
	    newPointLayer = new OpenLayers.Layer.Markers( "Nuevo Punto" );
		puntoModificar = null;
		map.addLayer(newPointLayer);
		defaultEvents.deactivate();
		map.removeControl(defaultEvents);
		if (newPointEvents==null){
			newPointEvents = new OpenLayers.Control.NewPoint();	        
		}
		map.addControl(newPointEvents);
        newPointEvents.activate();
		map.div.style.cursor="crosshair";
	}
	
	function changeTipoPunto(nuevoTipo){
		iconPoint.setUrl(mapIcons.getMisPuntosIcon(nuevoTipo).url);
		if (newPointMarker!=null){
			newPointMarker.icon.setUrl(mapIcons.getMisPuntosIcon(nuevoTipo).url);
		}
	}
	
	function cleanFormNuevoPunto(){
		hideDiv('newPointErrorDisplay');
		addOptionsToGrupoSelector();
		document.getElementById("newPointErrorDisplay").innerHTML = "";
		document.getElementById('puntoIdHID').value="";
		document.getElementById('newLatitud').innerHTML="";
		document.getElementById('newLongitud').innerHTML="";
		document.getElementById('tipoPunto').value="0";
		document.getElementById('descPunto').value="";
		document.getElementById('nombrePunto').value="";
		document.getElementById('puntoSeguroCHK').checked=false;
		if (parseInt(LOGIN.objetivoDB) == 3)
			document.getElementById('puntoPublicoCHK').checked=false;
		if (newPointMarker!=null){
			newPointMarker.display(false);			
		}
		iconPoint.setUrl(mapIcons.getMisPuntosIcon('0').url);	
	}
	
	/*************************FUNCIONES PARA PANTALLA MODIFICAR PUNTO************************/
	var puntoModificar = null;
	var updatePointEvents = null;
	var dragUpdatePointEvents = null;
	
	function modificarPunto(idPoint) {
			dejarDeSeguir();
		//mostrar panel de modificar punto
			document.getElementById('newPointTitle').innerHTML = "Modificar Punto";
			document.getElementById('newPointDesc').innerHTML = "Para modificar la altura del punto marcarlo con un 'click' arrastrarlo hasta la ubicacion deseada o bien utilizar la busqueda de direcciones por calle y altura provistas en el menu superior."
			initMisPuntosSelectorTipo();
			hideDiv('div_mispuntosPpal');
			hideDiv('div_searchPunto');
			showDiv('div_nuevoPunto');
			if ((idPoint!=null)||(puntoModificar==null))
				puntoModificar = misPuntosHash.get(idPoint.toString());
			cleanFormModificarPunto();
			setEstadoModificarPunto();
	}
		
	function setEstadoModificarPunto(){ //prepara el mapa para el estado "MODIFICAR PUNTO"
		newPointLayer = new OpenLayers.Layer.Markers( "Nuevo Punto" );
		map.addLayer(newPointLayer);
		ocultarPuntosVisibles();
		//creo la marker para modificar
		var lonlat = new OpenLayers.LonLat(parseFloat(puntoModificar.longitud), parseFloat(puntoModificar.latitud)).transform(displayProjection, projection);	
		newPointMarker = crearMarcaDePunto(lonlat,puntoModificar.nombre,null,iconPoint);
		if (updatePointEvents==null){
			updatePointEvents = new OpenLayers.Control.UpdatePoint();
	        map.addControl(updatePointEvents);
		}
		defaultEvents.deactivate();
        	updatePointEvents.activate();
		
		newPointLayer.addMarker(newPointMarker);				
		centrar(parseFloat(puntoModificar.latitud), parseFloat(puntoModificar.longitud));
		
		dragUpdatePointEvents = new OpenLayers.Control.DragMarker(newPointLayer, {'onComplete': function() { 
					var lonlat2 = newPointMarker.lonlat.clone().transform(projection, displayProjection);
					document.getElementById("newLatitud").innerHTML=lonlat2.lat.toString().substr(0,11);
					document.getElementById("newLongitud").innerHTML=lonlat2.lon.toString().substr(0,11);																					 					}});
		map.addControl(dragUpdatePointEvents);
		dragUpdatePointEvents.activate();
		map.div.style.cursor="crosshair";
	}
	
	function cleanEstadoModificarPunto(){ //limpia el mapa del estado "MODIFICAR PUNTO"
		hideDiv('div_nuevoPunto');
		showDiv('div_mispuntosPpal');
		
		if(updatePointEvents!=null)
		    updatePointEvents.deactivate();
		
		if (dragUpdatePointEvents!=null){
			dragUpdatePointEvents.deactivate();
			map.removeControl(dragUpdatePointEvents);
			dragUpdatePointEvents.destroy();
			dragUpdatePointEvents = null;		
		}
		if (newPointLayer!=null){
			map.removeLayer(newPointLayer);
			newPointMarker=null;
		}
		mostrarPuntosVisibles();	
		map.div.style.cursor="default";
	}
	
	function cleanFormModificarPunto(){
		hideDiv('newPointErrorDisplay');
		addOptionsToGrupoSelector();
		document.getElementById("newPointErrorDisplay").innerHTML = "";
		document.getElementById('puntoIdHID').value = puntoModificar.id;
		document.getElementById('newLatitud').innerHTML = puntoModificar.latitud;
		document.getElementById('newLongitud').innerHTML = puntoModificar.longitud;
		document.getElementById('tipoPunto').value = puntoModificar.icono;
		document.getElementById('descPunto').value = puntoModificar.datos;
		document.getElementById('nombrePunto').value = puntoModificar.nombre;
		document.getElementById('gruposPunto').value = puntoModificar.grupoId;
		document.getElementById('puntoSeguroCHK').checked=false;
		if (puntoModificar.seguro==1)
			document.getElementById('puntoSeguroCHK').checked=true;
		if (parseInt(LOGIN.objetivoDB) == 3){
			document.getElementById('puntoPublicoCHK').checked=false;
			if (puntoModificar.publico==1)
				document.getElementById('puntoPublicoCHK').checked=true;			
		}
		iconPoint.setUrl(mapIcons.getMisPuntosIcon(puntoModificar.icono).url);
		if ((newPointLayer!=null)&&(newPointMarker!=null)){
			var lonlat = new OpenLayers.LonLat(parseFloat(puntoModificar.longitud), parseFloat(puntoModificar.latitud));
			marcarNuevoPunto(lonlat);
			/*newPointMarker.lonlat = lonlat;
			var newPx = newPointLayer.getViewPortPxFromLonLat(lonlat);
			newPointMarker.moveTo(newPx);
			newPointMarker.icon.setUrl(iconPoint.url);
			centrar(parseFloat(puntoModificar.latitud), parseFloat(puntoModificar.longitud));*/
		}
	}
	
	
//funciones para busqueda y seteo de puntos ************************************************************************************************************** 

	function backBuscarPunto(){
		cleanEstadoBuscarPunto();
		if ( puntoModificar == null)
			nuevoPunto();
		else
			modificarPunto();
	}

	function cleanEstadoBuscarPunto(){	
		document.getElementById('_iframe-searchPunto').src="";
		hideDiv('div_searchPunto');
		hideDiv('div_searchPuntoLatLon');
		map.div.style.backgroundColor = "transparent";
	}
	
	function searchPointByGoogle(){
		window.parent.frames['_iframe-searchPunto'].GSearchPoint();
	}
	
	function searchPointByLatLon(){
		latitud = document.getElementById('searchLatitud').value;
		longitud = document.getElementById('searchLongitud').value;
		if (latitud == '') {
			alert('El campo latitud es obligatorio');
			return;
		}
		if (longitud == '') {
			alert('El campo longitud es obligatorio');
			return;
		}
		var lonlat = new OpenLayers.LonLat(longitud,latitud);
		lonlat = lonlat.transform(window.parent.displayProjection, window.parent.projection);
		if (isNaN(lonlat.lat) || isNaN(lonlat.lon)) {
			alert('la latitud o la longitud ingresada no es valida');
			return;
		}
		
		if (puntoModificar==null) {
			nuevoPunto();
		} else {
			modificarPunto();
		}
		marcarNuevoPunto(lonlat);
	        cleanEstadoBuscarPunto();
	}
	
	
	function setEstadoBuscarPunto(){
		showDiv('conectandoSearchPunto');
		hideDiv('conectandoSearchPuntoError');
		document.getElementById('buscarPuntoButton').style.visibility = "hidden";
		document.getElementById('_iframe-searchPunto').src="MMapFrames/misPuntosGmapGeocoder.php";
		map.div.style.backgroundColor = "black"; 
	}
		
	function buscarPunto() {
		//mostrar panel de buscar punto
		cleanEstadoNuevoPunto();
		hideDiv('div_mispuntosPpal');
		showDiv('div_searchPunto');
		setEstadoBuscarPunto();
	}
	
	function buscarPuntoLatLon() {
		//mostrar panel de buscar punto
		cleanEstadoNuevoPunto();
		document.getElementById('searchLatitud').value = '';
		document.getElementById('searchLongitud').value = '';
		hideDiv('div_mispuntosPpal');
		showDiv('div_searchPuntoLatLon');
		
		//setEstadoBuscarPunto();
	}
			
	function buscarPuntoRefresh() {
		showDiv('conectandoSearchPunto');
		hideDiv('conectandoSearchPuntoError');
		document.getElementById('_iframe-searchPunto').src="MMapFrames/misPuntosGmapGeocoder.php";
	}
	
	/*************************FUNCIONES PARA GUARDAR EL PUNTO************************/
	var reqHandlerSaveMisPuntos = null;
		
	function validarNuevoPunto(){
		errorMsg = '';
		lat = document.getElementById("newLatitud").innerHTML;
		lon = document.getElementById("newLongitud").innerHTML;
		tipo = document.getElementById("tipoPunto").value;
		desc = document.getElementById("descPunto").value;
		nombre = document.getElementById("nombrePunto").value;
		
		if ((trim(lat)=='')||(trim(lon)==''))
			errorMsg += "Debe marcar o buscar un punto antes de guardarlo.<br>";
		
		if (trim(nombre)!=''){
			if (!_validString(nombre))
				errorMsg += "El campo 'nombre' no acepta caracteres especiales.<br>";	
			}
		else
			errorMsg += "El campo 'nombre' es obligatorio.<br>";
		
		if (tipo=='0')
			errorMsg += "El campo 'tipo' es obligatorio.<br>";	
		
		if (trim(desc)!=''){
			if (!_validString(desc))
				errorMsg += "El campo 'descripcion' no acepta caracteres especiales.<br>";	
			}

		if (errorMsg == '')
			return true;
		document.getElementById("newPointErrorDisplay").innerHTML = errorMsg;
		showDiv("newPointErrorDisplay");
		return false;	
	}
	
	function OnReadyStateChangeSaveMisPuntos(){
		ready = reqHandlerSaveMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			nuevoPuntoJSON = reqHandlerSaveMisPuntos.responseText.parseJSON();
			if (nuevoPuntoJSON.id != -1) {	
				alert('Grabacion realizada con exito!');
				if (puntoModificar==null){
					misPuntosHash.put(nuevoPuntoJSON.id.toString(),nuevoPuntoJSON);
					misPuntosVisiblesId.push(nuevoPuntoJSON.id.toString());
					cleanEstadoNuevoPunto();
				}
				else{
					//modificar gmarker
					misPuntosHash.remove(nuevoPuntoJSON.id.toString());
					misPuntosHash.put(nuevoPuntoJSON.id.toString(),nuevoPuntoJSON);
					/*var pos = indexOfArray(misPuntosVisiblesId, nuevoPuntoJSON.id.toString());
					if (pos==-1)
						misPuntosVisiblesId.push(nuevoPuntoJSON.id.toString());*/
					marker = misPuntosMarkersHash.get(nuevoPuntoJSON.id.toString());
					if ((marker!=null)&&(marker!='undefined')){
						misPuntosMarkersHash.remove(nuevoPuntoJSON.id.toString());
					}
					//borro el punto que se modifico de hash de grupos->PUNTOSID;
					if (parseInt(puntoModificar.grupoId)!=0){
						var group = misGruposHash.get(puntoModificar.grupoId.toString());
						var pos = indexOfArray(group.PUNTOSID,puntoModificar.id);
						if (pos!=-1)
							group.PUNTOSID.splice(pos,1);
					}					
					cleanEstadoModificarPunto();
				}
				//agrego el puntoId al hash de grupos->PUNTOSID
				if (parseInt(nuevoPuntoJSON.grupoId)!=0){
					misGruposHash.get(nuevoPuntoJSON.grupoId.toString()).PUNTOSID.push(nuevoPuntoJSON.id.toString());
				}				
				refreshViewPoints();
			}
			else{
				document.getElementById('newPointErrorDisplay').innerHTML = 'Ocurrio un error en la DB al tratar de guardar el punto.'
				showDiv('newPointErrorDisplay');
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function guardarPunto() {
		hideDiv('newPointErrorDisplay');
		document.getElementById("newPointErrorDisplay").innerHTML = "";
		if (validarNuevoPunto()){		
			es_seguro = 0;
			es_flota = 0;
			es_publico = 0;
			if (parseInt(LOGIN.objetivoDB) == 3){
				es_flota=1;				
				if(document.getElementById('puntoPublicoCHK').checked)
					es_publico = 1;	
			}
			if(document.getElementById('puntoSeguroCHK').checked)
				es_seguro = 1;
			var oldGrupo = '0';
			if (puntoModificar!=null)
				oldGrupo = puntoModificar.grupoId;
	    	reqParamsMisPuntos = "COMMAND=SAVE";
    		reqParamsMisPuntos += "&ORDERID="+document.getElementById('puntoIdHID').value;
			reqParamsMisPuntos += "&NOMBRE="+document.getElementById('nombrePunto').value;
	    	reqParamsMisPuntos += "&LATITUD="+document.getElementById('newLatitud').innerHTML;
			reqParamsMisPuntos += "&LONGITUD="+document.getElementById('newLongitud').innerHTML;
    		reqParamsMisPuntos += "&DATOS="+document.getElementById('descPunto').value;
    		reqParamsMisPuntos += "&FLOTAID="+LOGIN.cuentaFk;
			reqParamsMisPuntos += "&ICONO="+document.getElementById('tipoPunto').value;
	    	reqParamsMisPuntos += "&SEGURO="+es_seguro;
			reqParamsMisPuntos += "&PUBLICO="+es_publico;
			//reqParamsMisPuntos += "&ESFLOTA="+es_flota;
			reqParamsMisPuntos += "&ESFLOTA="+LOGIN.objetivoDB;
			reqParamsMisPuntos += "&GRUPO="+document.getElementById('gruposPunto').value;
			reqParamsMisPuntos += "&OLDGRUPO="+oldGrupo;
			reqParamsMisPuntos += "&TABLAID="+LOGIN.tablaId;
			reqParamsMisPuntos += "&OBJETIVO="+LOGIN.objetivo;
    		autoRefreshFlag = 1;
	    	document.getElementById("busyImg").style.visibility = "visible";
    		if (msie) 
        	    reqHandlerSaveMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
	        else
    	        reqHandlerSaveMisPuntos = new XMLHttpRequest();			
			reqHandlerSaveMisPuntos.onreadystatechange = OnReadyStateChangeSaveMisPuntos;    
	        reqHandlerSaveMisPuntos.open("POST", "persistirpunto.php", true);
    	    reqHandlerSaveMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			reqHandlerSaveMisPuntos.send(reqParamsMisPuntos);
		}
    }
	
	/*************************FUNCIONES PARA ELIMINAR LOS PUNTOS SELECCIONADOS************************/
	var reqHandlerDeleteMisPuntos = null;
	var deletePuntoId = null;
	
	function OnReadyStateChangeDeleteMisPuntos(){
		ready = reqHandlerDeleteMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			deleteResponse = reqHandlerDeleteMisPuntos.responseText.parseJSON();
			if (deleteResponse){
				if(deletePuntoId==null){ //se ejecuto con minimenu
				 	ocultarPuntosSeleccionados();
				 	//ahora remuevo los puntos y las marcas que ya fueron eliminadas de sus respectivos arrays
				 	for (i=0; i<puntosSeleccionadosId.length; i++){
						misPuntosHash.remove(puntosSeleccionadosId[i].toString());					 	
					 	if (misPuntosMarkersHash.containsKey(puntosSeleccionadosId[i].toString())){
					 		mispuntosLayer.removeMarker(misPuntosMarkersHash.get(puntosSeleccionadosId[i].toString()));
							misPuntosMarkersHash.remove(puntosSeleccionadosId[i].toString());
						}
				 	}
				 	//por ultimo limpio el array de puntos seleccionados.
				 	puntosSeleccionadosId = new Array();	
				}
				else{ //se ejecuto con popupmenu
					pos=indexOfArray(puntosSeleccionadosId,deletePuntoId.toString());
				    if (pos!=-1)
						puntosSeleccionadosId.splice(pos,1);
					ocultarPunto(deletePuntoId.toString);
					misPuntosHash.remove(deletePuntoId.toString());
					if (misPuntosMarkersHash.containsKey(deletePuntoId.toString())){
					 	mispuntosLayer.removeMarker(misPuntosMarkersHash.get(deletePuntoId.toString()));
						misPuntosMarkersHash.remove(deletePuntoId.toString());
					}				
					deletePuntoId = null;					
				}
				refreshViewPoints();
			}
			else {
				alert ("Error en consulta a DB: No se pudo eliminar el/los puntos seleccionados");
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function eliminarPuntos(idPoint) {
		 deletePuntoId = null;
		 if ((puntosSeleccionadosId.length>0)||(idPoint!=null)){
			if (puntosSeleccionadosHeredadosId.length>0)
				alert ('Entre su seleccion existen puntos que no tienen permisos para realizar esta operacion.');
			conf = confirm('Esta a punto de eliminar el/los puntos seleccionados. ¿Desea continuar de todas formas?');
			if (conf){
		    	reqParamsMisPuntos = "COMMAND=DELETE";
				if(idPoint!=null){
	    			reqParamsMisPuntos += "&ORDERID="+idPoint;
					deletePuntoId = idPoint;
				}
				else
					reqParamsMisPuntos += "&ORDERID="+puntosSeleccionadosId.join(",");
    			autoRefreshFlag = 1;
	    		document.getElementById("busyImg").style.visibility = "visible";
	    		if (msie) 
    	    	    reqHandlerDeleteMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
	    	    else
    	    	    reqHandlerDeleteMisPuntos = new XMLHttpRequest();
	        	reqHandlerDeleteMisPuntos.onreadystatechange = OnReadyStateChangeDeleteMisPuntos;    
		        reqHandlerDeleteMisPuntos.open("POST", "persistirpunto.php", true);
    		    reqHandlerDeleteMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				reqHandlerDeleteMisPuntos.send(reqParamsMisPuntos);
			}
		 }
		 else
		 	if (puntosSeleccionadosHeredadosId.length>0)
				alert ('No esta permitido realizar esta operacion para los puntos seleccionados.');
			else
			 	alert ('Debe seleccionar por lo menos un punto para poder realizar esta operacion.');
    }

	/*************************FUNCIONES PARA PUBLICAR/DESPUBLICAR LOS PUNTOS SELECCIONADOS************************/
	var reqHandlerPublicarMisPuntos = null;
	var publicarPuntoId = null;
	
	function OnReadyStateChangePublicarMisPuntos(){
		ready = reqHandlerPublicarMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			publicarResponse = reqHandlerPublicarMisPuntos.responseText.parseJSON();
			if ((publicarResponse!=null)&&(publicarResponse!=-1)&&(publicarResponse!='undefined')){ // se pudo realizar la operacion, retorna 1 si se publico y 0 si se des-publico.	
				if(publicarPuntoId==null){ //se ejecuto con minimenu
					//ahora cambio el valor de los puntos por el devuelto (0 o 1)
				 	for (i=0; i<puntosSeleccionadosId.length; i++){
					 	temp = misPuntosHash.get(puntosSeleccionadosId[i].toString());
					 	if ((temp!=null)&&(temp!='undefined'))
					 		temp.publico = publicarResponse;
				 	}
				}
				else { //se ejecuto con POPUP MENU					
					if(misPuntosHash.containsKey(publicarPuntoId.toString()))
					    misPuntosHash.get(publicarPuntoId.toString()).publico = publicarResponse;	
					publicarPuntoId = null;													  
				}
				refreshViewPoints();				
			}
			else {
				alert ("Error en consulta a DB: No se pudo publicar el/los puntos seleccionados");
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function publicarPuntos(publicar, idPoint) { //si publicar=true los puntos se publican, caso contrario se des-publican
		 publicarPuntoId = null;
		 if ((puntosSeleccionadosId.length>0)||(idPoint!=null)){			 
			msj = 'Esta a punto de publicar el/todos los puntos seleccionados. ¿Desea continuar de todas formas?';
			if (!publicar)
				msj = 'Esta a punto de dejar de publicar el/los puntos seleccionados. ¿Desea continuar de todas formas?';
			conf = confirm(msj);
			if (conf){
				valuePub=0;
				if (publicar)
					valuePub=1;
		    	reqParamsMisPuntos = "COMMAND=PUBLICAR";
				if(idPoint!=null){
    				reqParamsMisPuntos += "&ORDERID="+idPoint.toString();
					publicarPuntoId = idPoint.toString();
				}
				else
					reqParamsMisPuntos += "&ORDERID="+puntosSeleccionadosId.join(",");
				reqParamsMisPuntos += "&PUBLICAR="+valuePub;
    			autoRefreshFlag = 1;
	    		document.getElementById("busyImg").style.visibility = "visible";
	    		if (msie) 
    	    	    reqHandlerPublicarMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
	    	    else
    	    	    reqHandlerPublicarMisPuntos = new XMLHttpRequest();
	        	reqHandlerPublicarMisPuntos.onreadystatechange = OnReadyStateChangePublicarMisPuntos;    
		        reqHandlerPublicarMisPuntos.open("POST", "persistirpunto.php", true);
    		    reqHandlerPublicarMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				reqHandlerPublicarMisPuntos.send(reqParamsMisPuntos);
			}
		 }
		 else
		 	alert ('Debe seleccionar por lo menos un punto para poder realizar esta operacion.');
    }
	
	/*************************FUNCIONES PARA MARCAR PUNTOS COMO SEGURO/INSEGURO LOS PUNTOS SELECCIONADOS************************/
	var reqHandlerSeguroMisPuntos = null;
	var seguroPuntoId = null;
	
	function OnReadyStateChangeSeguroMisPuntos(){
		ready = reqHandlerSeguroMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			seguroResponse = reqHandlerSeguroMisPuntos.responseText.parseJSON();
			if ((seguroResponse!=null)&&(seguroResponse!=-1)&&(seguroResponse!='undefined')){ // se pudo realizar la operacion, retorna 1 si se publico y 0 si se des-publico.
				if(seguroPuntoId==null){ //se ejecuto desde minimenu
				 	//ahora cambio el valor de los puntos por el devuelto (0 o 1)
				 	for (i=0; i<puntosSeleccionadosId.length; i++){
						temp = misPuntosHash.get(puntosSeleccionadosId[i].toString());
					 	if ((temp!=null)&&(temp!='undefined'))
					 		temp.seguro = seguroResponse;
				 	}
				}
				else { //se ejecuto desde POPUP MENU
					if(misPuntosHash.containsKey(seguroPuntoId.toString()))
					    misPuntosHash.get(seguroPuntoId.toString()).seguro = seguroResponse;	
					seguroPuntoId = null;
				}					
				refreshViewPoints();				
			}
			else {
				alert ("Error en consulta a DB: No se pudo marcar/desmarcar como seguro a el/los puntos seleccionados");
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function seguroPuntos(seguro, idPoint) { //si seguro=true los puntos se marcan como seguros, caso contrario se des-aseguran
		 seguroPuntoId = null;
		 if ((puntosSeleccionadosId.length>0)||(idPoint!=null)){	
		 	if (puntosSeleccionadosHeredadosId.length>0)
				alert ('Entre su seleccion existen puntos que no tienen permisos para realizar esta operacion.');
			msj = 'Esta a punto de marcar como seguro a el/los puntos seleccionados. ¿Desea continuar de todas formas?';
			if (!seguro)
				msj = 'Esta a punto de desmarcar como seguro a el/los puntos seleccionados. ¿Desea continuar de todas formas?';
			conf = confirm(msj);
			if (conf){
				valuePub=0;
				if (seguro)
					valuePub=1;
		    	reqParamsMisPuntos = "COMMAND=SEGURO";
				if (idPoint!=null){
					reqParamsMisPuntos += "&ORDERID="+idPoint.toString();
					seguroPuntoId = idPoint.toString();
				}
				else
	    			reqParamsMisPuntos += "&ORDERID="+puntosSeleccionadosId.join(",");
				reqParamsMisPuntos += "&SEGURO="+valuePub;
    			autoRefreshFlag = 1;
	    		document.getElementById("busyImg").style.visibility = "visible";
	    		if (msie) 
    	    	    reqHandlerSeguroMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
	    	    else
    	    	    reqHandlerSeguroMisPuntos = new XMLHttpRequest();
	        	reqHandlerSeguroMisPuntos.onreadystatechange = OnReadyStateChangeSeguroMisPuntos;    
		        reqHandlerSeguroMisPuntos.open("POST", "persistirpunto.php", true);
    		    reqHandlerSeguroMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				reqHandlerSeguroMisPuntos.send(reqParamsMisPuntos);
			}
		 }
		 else
		 	if (puntosSeleccionadosHeredadosId.length>0)
				alert ('No esta permitido realizar esta operacion para los puntos seleccionados.');
			else
		 		alert ('Debe seleccionar por lo menos un punto para poder realizar esta operacion.');
    }
	
	/*************************FUNCIONES PARA CONFIGURAR COMO VISIBLES POR DEFECTO A LOS PUNTOS SELECCIONADOS************************/
	var reqHandlerDefaultMisPuntos = null;
	
	function OnReadyStateChangeDefaultMisPuntos(){
		ready = reqHandlerDefaultMisPuntos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function defaultPuntosSeleccionados() { 			 
			msj = 'Esta a punto de configurar el/todos los puntos seleccionados como visible por defecto. ¿Desea continuar de todas formas?';
			conf = confirm(msj);
			if (conf){
		    	reqParamsMisPuntos = "COMMAND=CHANGEPUNTOS";
				reqParamsMisPuntos += "&CUENTA="+ LOGIN.cuentaFk;
				reqParamsMisPuntos += "&ESFLOTA="+ LOGIN.objetivoDB;
				reqParamsMisPuntos += "&TABLAID="+LOGIN.tablaId;
				reqParamsMisPuntos += "&OBJETIVO="+LOGIN.objetivo;
				/*if (parseInt(LOGIN.objetivoDB) == 3)
					reqParamsMisPuntos += "&ESFLOTA=1";
				else
					reqParamsMisPuntos += "&ESFLOTA=0";*/
				var puntosSelMixtaId = "";
				if (puntosSeleccionadosId.length>0){
					puntosSelMixtaId += puntosSeleccionadosId.toString();
					if (puntosSeleccionadosHeredadosId.length>0)
						puntosSelMixtaId +=",";
				}
				puntosSelMixtaId += puntosSeleccionadosHeredadosId.toString();		
				reqParamsMisPuntos += "&PUNTOSID="+puntosSelMixtaId;
    			autoRefreshFlag = 1;
	    		document.getElementById("busyImg").style.visibility = "visible";
	    		if (msie) 
    	    	    reqHandlerDefaultMisPuntos = new ActiveXObject("Microsoft.XMLHTTP");
	    	    else
    	    	    reqHandlerDefaultMisPuntos = new XMLHttpRequest();
	        	reqHandlerDefaultMisPuntos.onreadystatechange = OnReadyStateChangeDefaultMisPuntos;    
		        reqHandlerDefaultMisPuntos.open("POST", "sections/queryConfig.php", true);
    		    reqHandlerDefaultMisPuntos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				reqHandlerDefaultMisPuntos.send(reqParamsMisPuntos);
			}
    }

//*********************** TRATAMIENTO DE GRUPOS *******************************//
	var reqHandlerMisGrupos;
	var grupoModificar = null;

	function nuevoGrupo(){
		//mostrar panel de nuevo grupo
		document.getElementById('newGroupTitle').innerHTML = "Nuevo Grupo";
		document.getElementById('newGroupDesc').innerHTML = "Los grupos se utilizan para almacenar puntos que tienen caracteristicas en comun. Sugerimos que les coloque un nombre representativo.";
		hideDiv('div_mispuntosPpal');
		showDiv('div_nuevoGrupo');
		cleanFormNuevoGrupo();
	}
	
	function modificarGrupo(idGrupo){
		document.getElementById('newGroupTitle').innerHTML = "Modificar Grupo";
		document.getElementById('newGroupDesc').innerHTML = "";
		hideDiv('div_mispuntosPpal');
		showDiv('div_nuevoGrupo');
		grupoModificar = misGruposHash.get(idGrupo.toString());
		cleanFormModificarGrupo();
	}
	
	function cleanFormNuevoGrupo(){
		hideDiv('newGroupErrorDisplay');
		document.getElementById("newGroupErrorDisplay").innerHTML = "";
		document.getElementById('grupoIdHID').value="";
		document.getElementById('descGrupo').value="";
		document.getElementById('nombreGrupo').value="";
	}
	
	function cleanFormModificarGrupo(){
		hideDiv('newGroupErrorDisplay');
		document.getElementById("newGroupErrorDisplay").innerHTML = "";
		document.getElementById('grupoIdHID').value=grupoModificar.id;
		document.getElementById('descGrupo').value=grupoModificar.datos;
		document.getElementById('nombreGrupo').value=grupoModificar.nombre;
	}
	
	function cleanEstadoNuevoGrupo(){ //limpia el mapa del estado "MODIFICAR/NUEVO GRUPO"
		hideDiv('div_nuevoGrupo');
		showDiv('div_mispuntosPpal');
	}
	
	function OnReadyStateChangeMisGrupos(){
		ready = reqHandlerMisGrupos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			misGruposJSON = reqHandlerMisGrupos.responseText.parseJSON();
			if (misGruposJSON.length != 'undefined') {	
				for (i=0; i<misGruposJSON.length; i++)
					misGruposHash.put(misGruposJSON[i].id.toString(),misGruposJSON[i]);				
			}	
		document.getElementById("busyImg").style.visibility = "hidden";
		autoRefreshFlag = 0;
		CargarMisPuntos();
		}
	}
	
	function CargarMisGrupos() {
    	reqParamsMisGrupos = "COMMAND=MISGRUPOS";
    	reqParamsMisGrupos += "&CUENTA=" + LOGIN.cuentaFk;
		reqParamsMisGrupos += "&ESFLOTA="+ LOGIN.objetivoDB;
		reqParamsMisGrupos += "&OBJETIVO="+ LOGIN.objetivo;
		reqParamsMisGrupos += "&TABLAID="+ LOGIN.tablaId;
		/*if (parseInt(LOGIN.objetivoDB) == 3)
			reqParamsMisGrupos += "&ESFLOTA=1";
		else
			reqParamsMisGrupos += "&ESFLOTA=0";*/
    	document.getElementById("busyImg").style.visibility = "visible";
    	if (msie) 
            reqHandlerMisGrupos = new ActiveXObject("Microsoft.XMLHTTP");
        else
            reqHandlerMisGrupos = new XMLHttpRequest();
        reqHandlerMisGrupos.onreadystatechange = OnReadyStateChangeMisGrupos;    
        reqHandlerMisGrupos.open("POST", "querycontroller.php", true);
        reqHandlerMisGrupos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		reqHandlerMisGrupos.send(reqParamsMisGrupos);
    }
	
	function validarNuevoGrupo(){
		errorMsg = '';
		desc = document.getElementById("descGrupo").value;
		nombre = document.getElementById("nombreGrupo").value;
		
		if (trim(nombre)!=''){
			if (!_validString(nombre))
				errorMsg += "El campo 'nombre' no acepta caracteres especiales.<br>";	
			}
		else
			errorMsg += "El campo 'nombre' es obligatorio.<br>";
		
		if (trim(desc)!=''){
			if (!_validString(desc))
				errorMsg += "El campo 'descripcion' no acepta caracteres especiales.<br>";	
			}

		if (errorMsg == '')
			return true;
		document.getElementById("newGroupErrorDisplay").innerHTML = errorMsg;
		showDiv("newGroupErrorDisplay");
		return false;	
	}
	
	var reqHandlerSaveMisGrupos;
	function OnReadyStateChangeSaveMisGrupos(){
		ready = reqHandlerSaveMisGrupos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			nuevoGrupoJSON = reqHandlerSaveMisGrupos.responseText.parseJSON();
			if (nuevoGrupoJSON.id != -1) {		
				misGruposHash.put(nuevoGrupoJSON.id.toString(),nuevoGrupoJSON);
				alert('Grabacion realizada con exito!');
				cleanEstadoNuevoGrupo();
				refreshViewPoints();
			}
			else{
				document.getElementById('newGroupErrorDisplay').innerHTML = 'Ocurrio un error en la DB al tratar de guardar el grupo.'
				showDiv('newGroupErrorDisplay');
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function guardarGrupo() {
		hideDiv('newGroupErrorDisplay');
		document.getElementById("newGroupErrorDisplay").innerHTML = "";
		if (validarNuevoGrupo()){	
			es_flota = 0;
			if (parseInt(LOGIN.objetivoDB) == 3){
				es_flota=1;				
			}
	    	reqParamsMisGrupos = "COMMAND=SAVEGROUP";
    		reqParamsMisGrupos += "&ORDERID="+document.getElementById('grupoIdHID').value;
			reqParamsMisGrupos += "&NOMBRE="+document.getElementById('nombreGrupo').value;
    		reqParamsMisGrupos += "&DATOS="+document.getElementById('descGrupo').value;
    		reqParamsMisGrupos += "&FLOTAID="+LOGIN.cuentaFk;
			reqParamsMisGrupos += "&ESFLOTA="+LOGIN.objetivoDB;
			reqParamsMisGrupos += "&TABLAID="+LOGIN.tablaId;
			reqParamsMisGrupos += "&OBJETIVO="+LOGIN.objetivo;
    		autoRefreshFlag = 1;
	    	document.getElementById("busyImg").style.visibility = "visible";
    		if (msie) 
        	    reqHandlerSaveMisGrupos = new ActiveXObject("Microsoft.XMLHTTP");
	        else
    	        reqHandlerSaveMisGrupos = new XMLHttpRequest();			
			reqHandlerSaveMisGrupos.onreadystatechange = OnReadyStateChangeSaveMisGrupos;    
	        reqHandlerSaveMisGrupos.open("POST", "persistirpunto.php", true);
    	    reqHandlerSaveMisGrupos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			reqHandlerSaveMisGrupos.send(reqParamsMisGrupos);
		}
    }
	
	var reqHandlerDeleteMisGrupos = null;
	var deleteGrupoId = null;
	
	function OnReadyStateChangeDeleteMisGrupos(){
		ready = reqHandlerDeleteMisGrupos.readyState;
		if (ready == READY_STATE_COMPLETE) {
			deleteResponse = reqHandlerDeleteMisGrupos.responseText.parseJSON();
			if (deleteResponse){
				if(deleteGrupoId!=null){
					var grupo = misGruposHash.get(deleteGrupoId.toString());	
							
				 	//ahora remuevo los puntos y las marcas que ya fueron eliminadas de sus respectivos arrays
					for (var i=0; i<grupo.PUNTOSID.length; i++)
						misPuntosHash.get(grupo.PUNTOSID[i].toString()).grupoId=0;	//dejo los puntos en el directorio raiz...
					misGruposHash.remove(deleteGrupoId.toString());
					deleteGrupoId = null;			
				}
				refreshViewPoints();
			}
			else {
				alert ("Error en consulta a DB: No se pudo eliminar el/los grupos seleccionados");
			}
			document.getElementById("busyImg").style.visibility = "hidden";
			autoRefreshFlag = 0;
		}
	}
	
	function eliminarGrupos(idGrupo) {
			deleteGrupoId = null;
			conf = confirm('Esta a punto de eliminar el/los grupos seleccionados y todos los puntos que este contiene. ¿Desea continuar de todas formas?');
			if (conf){
		    	reqParamsMisGrupos = "COMMAND=DELETEGROUP";
	    		reqParamsMisGrupos += "&ORDERID="+idGrupo;
				deleteGrupoId = idGrupo;
    			autoRefreshFlag = 1;
	    		document.getElementById("busyImg").style.visibility = "visible";
	    		if (msie) 
    	    	    reqHandlerDeleteMisGrupos = new ActiveXObject("Microsoft.XMLHTTP");
	    	    else
    	    	    reqHandlerDeleteMisGrupos = new XMLHttpRequest();
	        	reqHandlerDeleteMisGrupos.onreadystatechange = OnReadyStateChangeDeleteMisGrupos;    
		        reqHandlerDeleteMisGrupos.open("POST", "persistirpunto.php", true);
    		    reqHandlerDeleteMisGrupos.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				reqHandlerDeleteMisGrupos.send(reqParamsMisGrupos);
			}
    }
	
	function checkedGrupo(idGrupo, checkedValue){		
		var fields = document.getElementsByName('boxPoints[]');
		var groupPoints = misGruposHash.get(idGrupo.toString()).PUNTOSID;
		for (i = 0; i < fields.length; i++)
			if (fields[i].checked!=checkedValue){
				var pos=indexOfArray(groupPoints,fields[i].value.toString());
				if (pos!=-1) 
					fields[i].click();
			}
	}


//DECLARACION DE EVENTOS
	function initMisPuntosEvents() {
			//Nuevo Punto
			OpenLayers.Control.NewPoint = OpenLayers.Class(OpenLayers.Control, {                
                defaultHandlerOptions: {
                    'single': true,
                    'double': false,
                    'pixelTolerance': 0,
                    'stopSingle': false,
                    'stopDouble': false
                },
 
                initialize: function(options) {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    ); 
                    this.handler = new OpenLayers.Handler.Click(
                        this, {
                            'click': this.onClick
                        }, this.handlerOptions
                    );
                }, 
 
                onClick: function(e) {
                    var pixel = new OpenLayers.Pixel(e.xy.x, e.xy.y);
                    var lonlat = map.getLonLatFromPixel(pixel);
                    window.marcarNuevoPunto(lonlat);
                }
 
            });
		   
		   //Modificar Punto
			OpenLayers.Control.UpdatePoint = OpenLayers.Class(OpenLayers.Control, {                
                defaultHandlerOptions: {
                    'single': true,
                    'double': false,
                    'pixelTolerance': 0,
                    'stopSingle': false,
                    'stopDouble': false
                },
 
                initialize: function(options) {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    ); 
                    this.handler = new OpenLayers.Handler.Click(
                        this, {
                            'click': this.onClick
                        }, this.handlerOptions
                    );
                }, 
 
                onClick: function(e) {
					var pixel = new OpenLayers.Pixel(e.xy.x, e.xy.y);
                    var lonlat = map.getLonLatFromPixel(pixel);					
                    marcarNuevoPunto(lonlat);
                } 			
            });
			
			newPointEvents = new OpenLayers.Control.NewPoint();			
			//map.addControl(newPointEvents);
			newPointEvents.deactivate();
	}

/*--------------------- funciones para encontrar moviles cercanos a un punto ---------------------------------- */

function printTableMovilesCercanosPunto(gDC){
		var idMinimenu = 'minimenuMCP'+gDC.id;
		var isFromDG = gDC.isFromGestorDir;
		var point = ((isFromDG)?gestorDirHash.get(gDC.id.substring(3)):misPuntosHash.get(gDC.id));
		var table = '<div id="containerMCP'+gDC.id+'">';
		table += '<div class="MiniMenu" id="'+idMinimenu+'">';
		table += '<table width="330" cellspacing="0" cellpadding="1">';
		table += '<tr>';
		table += '  <td colspan="5">';
		if(isFromDG)
			table += '<span class="sectionTITLE">Moviles mas cercanos a la direccion "'+point.name+'":</span>';
		else
			table += '<span class="sectionTITLE">Moviles mas cercanos al punto "'+point.nombre+'":</span>'; 
		table += ' </td>';
		table += '</tr>';
		table += '<tr>';
		table += ' <td><span class="resaltado">Moviles</span></td>';
		table += ' <td><span class="resaltado">Distancias</span></td>';
		table += ' <td></td>';
		table += ' <td></td>';
		table += ' <td></td>';
		table += '</tr>';
		if (gDC.movilesDistances.length>0){
			for (var i=0; (i<gDC.movilesDistances.length && i<MAXMOVILCERCA); i++){
				var dis = gDC.movilesDistances[i].distance.toFixed(3).toString();
				var disKm = dis.slice(0,dis.indexOf('.'));
				var disMts = dis.slice(dis.indexOf('.')+1);
				var distance = (disKm == '0' || disKm == '') ? "" : (disKm +'km ');
				distance += (disMts == '0' || disMts == '') ? "" : (disMts + 'm');
				distance = (distance == '') ? "0m" : distance;
				var movil = misVehiculosHash.get(gDC.movilesDistances[i].movilId);
				table += '<tr>';
				table += ' <td><span class="inputTEXT">'+movil.label+'</span></td>';
				table += ' <td><span class="inputTEXT">'+distance+'</span></td>';
				table += ' <td><img src="js/tablero/images/BTNseguir.gif" border="1" onclick="seguirMovil('+movil.id+');" title="Seguir este movil" style="cursor:pointer; border:1px solid #F3F3F3; background:#5D5D5D;"/></td>';
				table += ' <td><img src="js/tablero/images/BTNcentrar.gif" onclick="dejarDeSeguir(); localizarMovil('+movil.id+');" title="Localizar este movil" border="1" style="cursor:pointer; border:1px solid #F3F3F3; background:#5D5D5D;"/></td>';
				table += ' <td><img src="js/tablero/images/BTNdistancia.gif" onclick="dejarDeSeguir(); putHighlightCercanias(\''+gDC.id+'\',2,\''+movil.id+'\');" title="Mostrar distancia en el mapa" border="1" style="cursor:pointer; border:1px solid #F3F3F3; background:#5D5D5D;"/></td>';
				table += '</tr>';
			}
		}
		else {
			table += '<tr><td colspan="5"><span class="inputTEXT">No existen moviles visibles que se encuentren en cercanias de este punto.</span></td></tr>';		
		}
		table += '</table>';
		table += '</div>';
		table += '</div>';
		document.getElementById('genericDHTMLWindowDiv').innerHTML=table;			
		minimenu = new MiniMenu({
     							name: idMinimenu,
     							contentId: idMinimenu,
								width:'355px',
								height:'208px'
     							});
		minimenu.addButton({
							classButton: 'movilCerca',
							onClickFunction: function(){
												dejarDeSeguir();
												putHighlightCercanias(gDC,0);
											 },
							info: 'Mostrar distancias generales'
						  });
		minimenu.addButton({
							classButton: 'movilCercaZoom',
							onClickFunction: function(){
												dejarDeSeguir();
												putHighlightCercanias(gDC,1);
											 },
							info: 'Mostrar distancias acercando las mas proximas'
						  });
}

var movilesCercanosHash = new Hashtable(); //HASHTABLE CON OBJETOS JS DEL TIPO 'movilesCercanosHash'
function generateMovilesCercanosPunto(idPunto, isFromGestorDir){
	if ((!isFromGestorDir)&&(indexOfArray(misPuntosVisiblesId,idPunto.toString())==-1))
		mostrarPunto(idPunto.toString());
	var idCercanos =  ((isFromGestorDir)?'GD_'+idPunto:idPunto);	
	var gD = ((isFromGestorDir)?gestorDirHash.get(idPunto.toString()):misPuntosHash.get(idPunto.toString()));
	var gDC = movilesCercanosHash.get(idCercanos);
	if (gDC==null){
		gDC = new GestorDirCercanos({
								   	id: idCercanos,
									lat: ((isFromGestorDir)?gD.lat:gD.latitud),
									lon: ((isFromGestorDir)?gD.lon:gD.longitud),
									isFromGestorDir: isFromGestorDir
								   });
		movilesCercanosHash.put(gDC.id, gDC);
	}
	else {
		if (gDC.POPUP!=null)
			gDC.POPUP.close();
	}
	var distances = gDC.calculate(vehiculosVisiblesId);	
	printTableMovilesCercanosPunto(gDC);
	var nombrePunto = ((isFromGestorDir)?gD.name:gD.nombre)
	var div = document.createElement('div');
	div.appendChild(document.getElementById('containerMCP'+gDC.id));	
	dejarDeSeguir();
	gDC.POPUP = dhtmlwindow.open('windowMCP_'+idCercanos, 'div', div, 'Cercanos a "'+nombrePunto+'"', 'width=360px,height=210px,left=200px,top=150px,resize=0,scrolling=1');	
	gDC.onclose = function(){gDC.POPUP = null;};	
	putHighlightCercanias(gDC);
}


	var highlightCercaniasLayer = null;
	var highlightCercaniasTimeOut = 0;
	
	function removeHighlightCercanias(){
		if (highlightCercaniasLayer){ 
			map.removeLayer(highlightCercaniasLayer); 
			highlightCercaniasLayer.destroy();
			highlightCercaniasLayer=null;
		}
	}
	
	function putHighlightCercanias(gDC, typeZoom, toMovilId){	
		//TYPE VALUE: 0 = hace zoom a todas las distancias en el mapa
		//TYPE VALUE: 1 = hace zoom a las distancias mas cercanas (diferencias no mayores a 5 km entre si)
		//TYPE VALUE: 2 = hace zoom entre el punto y un movil especificado en 'toMovilId'
		if (typeof gDC == 'string'){
			gDC = movilesCercanosHash.get(gDC);
		}
		if (typeZoom==null)
			var typeZoom = 0;
		if (highlightCercaniasLayer) {
   		    removeHighlightCercanias();			
      	}	
		//create vector layer
		highlightCercaniasLayer = new OpenLayers.Layer.Vector("highlightCercanias");
		//function highlight in point
		createFeaturePoint = function(point, color){	
			var colorFill = "#FFFFFF";
			if (color)
				colorFill = color;
			var radio = map.getExtent().getHeight()/25;
			var objF = OpenLayers.Geometry.Polygon.createRegularPolygon(point, radio, 20, 90);
			var theFeature = new OpenLayers.Feature.Vector(objF,null,{
            					strokeColor: "#202020",
								fillColor: colorFill,
            					strokeOpacity: 0.6,
								fillOpacity: 0.6,
            					strokeWidth: 1
        					 });
			return theFeature;
		}
		//function draw line
		createFeatureLine = function(from, to, color){	
			var colorLine = "#414141";
			if (color)
				colorLine = color;
			var lineString = new OpenLayers.Geometry.LineString([from, to]);
			var theFeature = new OpenLayers.Feature.Vector(lineString,null,{
								strokeColor: colorLine,
                    			strokeOpacity: 0.6,
                    			strokeWidth: 1,
								strokeDashstyle: 'dash' 
								
        					 });
			return theFeature;
		}
		
		var puntoMoviles = new Array();
		var featureBounds = new OpenLayers.Bounds();
		var origin = new OpenLayers.Geometry.Point(gDC.lon, gDC.lat).transform(displayProjection, projection);
		featureBounds.extend(origin);
		//create features
		puntoMoviles.push(origin);
		
		var minDistaceFlag = 0;
		if (gDC.movilesDistances.length>0)
			minDistaceFlag = gDC.movilesDistances[0].distance;
		for (var i=0; (i<gDC.movilesDistances.length && i<MAXMOVILCERCA); i++){
			var movilId = gDC.movilesDistances[i].movilId.toString();
			//if ()
			var movil = misVehiculosHash.get(movilId);
			var point = new OpenLayers.Geometry.Point(movil.POSIMOVIL.longitud, movil.POSIMOVIL.latitud).transform(displayProjection, projection);
			switch(parseInt(typeZoom)){
				case 0: featureBounds.extend(point);
						break;
				case 1: var distCalcul = gDC.movilesDistances[i].distance - minDistaceFlag;
						if (distCalcul<=5)
							featureBounds.extend(point);
						break;							
				case 2: if (movilId == toMovilId.toString())
							featureBounds.extend(point);
						break;
			}
			if ((parseInt(typeZoom)!=2)||((parseInt(typeZoom)==2)&&(movilId == toMovilId.toString()))){
				puntoMoviles.push(point);
				if (i==0)
					var line = createFeatureLine(origin, point, "#0000FF");
				else
					var line = createFeatureLine(origin, point);
				highlightCercaniasLayer.addFeatures(line);
			}
		}
		//centrar en bounds
		map.zoomToExtent(featureBounds);
		//highlight moviles
		for (var i=0; i<puntoMoviles.length; i++){ 
			var feat = null;
			switch (i){
				case 0: feat = createFeaturePoint(puntoMoviles[0], "#008000"); break;
				case 1: feat = createFeaturePoint(puntoMoviles[1], "#0000FF"); break;
				default: feat = createFeaturePoint(puntoMoviles[i]);
			}
			highlightCercaniasLayer.addFeatures(feat);
		}

		//add layer		
		map.addLayer(highlightCercaniasLayer);
		//set timeOut for the layer
		clearTimeout(highlightCercaniasTimeOut);
		highlightCercaniasTimeOut = setTimeout ( "removeHighlightCercanias();", 10000);
		
	}